Adding official cell-type labels to Seurat objects based on cluster
labels.
Load libraries
library(Seurat)
library(dplyr)
Liver map
Read in liver map
sobj <- readRDS("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/dropletQC_filtered/allIntegrated_cca_kanchor5_noBiopsyHeps_dropletQCFiltered.RDS")
res <- "integrated_snn_res.1.4"
Idents(sobj) <- res
View UMAP
DimPlot(sobj, label = TRUE)

Grab cluster IDs and replace with cell-type names - Endothelial
cells: 0, 5, 8, 11, 30, 32, 33, 41, 42 - Lymphocytes: 1, 2, 4, 6, 7, 10,
12, 14, 24, 35 - Lymphocytes 1: 1, 2, 4, 7, 10, 12, 16 - Lymphocytes 2
(XCL1;XCL2+): 6, 24, 39 - Lymphocytes 3 (LEF1+): 14 - Lymphocytes 4
(TOP2A+): 35 - Myeloid cells: 3, 9, 15, 17, 18, 22, 31, 37, 40, 43 -
Myeloid 1 (CD5L+): 3, 22, 43 - Myeloid 2 (S100A8+): 9, 18 - Myeloid 3:
15, 17 - Myeloid 4 (CST3+): 31 - Hepatocytes: 13, 16, 19, 20, 21, 25,
28, 36 - Antibody-secreting B cells: 23 - Mesenchymal: 26 - B cells: 27,
44 - Cholangiocytes: 34, 38 - Doublets/contamination: 20, 29, 37, 40,
42
Visualise general cell-type markers
# Hepatocytes
FeaturePlot(sobj, features = c("ALB-1"))

FeaturePlot(sobj, features = c("CYP2E1","PCK1"))

# Endothelial
FeaturePlot(sobj, features = c("STAB2","CLEC4G"))

FeaturePlot(sobj, features = c("RSPO3","MECOM"))

# Lymphocytes
FeaturePlot(sobj, features = c("CD3E"))

FeaturePlot(sobj, features = c("XCL1;XCL2","LEF1"))

# B cells
FeaturePlot(sobj, features = c("CD79B", "MS4A1"))

# Plasma cells
FeaturePlot(sobj, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(sobj, features = c("LYZ-1","S100A8"))

FeaturePlot(sobj, features = c("CD5L","C1QB"))

FeaturePlot(sobj, features = c("CST3","FLT3"))

# Cholangiocytes
FeaturePlot(sobj, features = c("KRT19","SLC4A4"))

# Mast cells
FeaturePlot(sobj, features = c("Prss29"))

clusters <- as.character(Idents(sobj))
clusters <- gsub('\\b0\\b|\\b5\\b|\\b8\\b|\\b11\\b|\\b30\\b|\\b32\\b|\\b33\\b|\\b41\\b|\\b42\\b', "Endothelial",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b|\\b2\\b|\\b4\\b|\\b7\\b|\\b10\\b|\\b12\\b|\\b16\\b', "Lymphocytes 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b6\\b|\\b24\\b|\\b39\\b', "Lymphocytes 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b3\\b|\\b22\\b|\\b43\\b', "Myeloid 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b14\\b', "Lymphocytes 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b35\\b', "Lymphocytes 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b9\\b|\\b18\\b', "Myeloid 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b15\\b|\\b17\\b', "Myeloid 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b31\\b', "Myeloid 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b13\\b|\\b16\\b|\\b19\\b|\\b20\\b|\\b21\\b|\\b25\\b|\\b28\\b|\\b36\\b', "Hepatocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b23\\b', "Antibody-secreting B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b26\\b', "Mesenchymal",
clusters,
perl = TRUE)
clusters <- gsub('\\b27\\b|\\b44\\b', "B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b34\\b|\\b38\\b', "Cholangiocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b20\\b|\\b29\\b|\\b37\\b|\\b40\\b|\\b42\\b', "Doublets/Contamination",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells" "B cells" "Cholangiocytes"
[4] "Doublets/Contamination" "Endothelial" "Hepatocytes"
[7] "Lymphocytes 1" "Lymphocytes 2" "Lymphocytes 3"
[10] "Lymphocytes 4" "Mesenchymal" "Myeloid 1"
[13] "Myeloid 2" "Myeloid 3" "Myeloid 4"
Add as metadata and visualise on UMAP
sobj@meta.data$general_cell_labels <- clusters
DimPlot(sobj, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
saveRDS(sobj,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/dropletQC_filtered/allIntegrated_cca_kanchor5_noBiopsyHeps_dropletQCFiltered.RDS")
Remove objects from environment
rm(list=ls())
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 3906831 208.7 6285432 335.7 6285432 335.7
Vcells 7997258 61.1 1395876723 10649.7 1043869020 7964.1
PBMC map
Read in PBMC map
load("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/integrated_PBMC_cca_kanchor5_scClustViz.RData")
sobj <- scSeurat
res <- "integrated_snn_res.0.6"
Idents(sobj) <- res
View UMAP
DimPlot(sobj, label = TRUE)

Grab cluster IDs and replace with cell-type names - Monocytes: 0, 6,
8, 9, 21, 24 - Monocytes 1 (CD16+): 0, 21, 24 - Monocytes 2 (CD14+): 6,
9 - Monocytes 3 (intermediate?): 8 - Monocytes 4 (PLAC8+/dendritic?): 14
- Lymphocytes: 1, 2, 4, 5, 7, 10, 13, 15, 17 - Lymphocytes 1: 2, 5, 13,
17 - Lymphocytes 2 (XCL1;XCL2+): 4, 7 - Lymphocytes 3 (LEF1+): 1, 10 -
Lymphocytes 4 (dividing): 23 - Lymphocytes 5 (RHEX+): 15 - B-cells: 3,
11 - HSC: 16 - Plasma B: 18 - Megakaryocytes: 19 - Mast cell: 22 -
Erythrocytes: 12 - Unknown: 20
Visualise general cell-type markers:
# Lymphocytes
FeaturePlot(sobj, features = c("CD3E","STMN1"))

FeaturePlot(sobj, features = c("XCL1;XCL2","LEF1"))

FeaturePlot(sobj, features = c("NKG7","CD5"))

FeaturePlot(sobj, features = c("CD247","RHEX"))

# B cells
FeaturePlot(sobj, features = c("BANK1", "MS4A1"))

# Plasma cells
FeaturePlot(sobj, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(sobj, features = c("S100A8"))

FeaturePlot(sobj, features = c("CD14","FCGR3A;FCGR3B"))

FeaturePlot(sobj, features = c("Fcgr3;Fcgr2b","FLT3"))

FeaturePlot(sobj, features = c("CST3","FLT3"))

# Megakaryocytes
FeaturePlot(sobj, features = c("GP9","TREML1"))

# Mast cells
FeaturePlot(sobj, features = c("Prss29","Prss34"))

# Erythrocytes
FeaturePlot(sobj, features = c("HBA2;HBA1"))

clusters <- as.character(Idents(sobj))
clusters <- gsub('\\b3\\b|\\b11\\b', "B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b|\\b10\\b', "Lymphocytes 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b2\\b|\\b5\\b|\\b13\\b|\\b17\\b', "Lymphocytes 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b4\\b|\\b7\\b', "Lymphocytes 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b0\\b|\\b21\\b|\\b24\\b', "Monocytes 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b23\\b', "Lymphocytes 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b15\\b', "Lymphocytes 5",
clusters,
perl = TRUE)
clusters <- gsub('\\b6\\b|\\b9\\b', "Monocytes 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b8\\b', "Monocytes 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b14\\b', "Monocytes 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b18\\b', "Plasma B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b16\\b', "Hematopoietic stem cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b19\\b', "Megakaryocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b22\\b', "Mast cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b12\\b', "Erythrocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b20\\b', "Unknown",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "B cells" "Erythrocytes" "Hematopoietic stem cells"
[4] "Lymphocytes 1" "Lymphocytes 2" "Lymphocytes 3"
[7] "Lymphocytes 4" "Lymphocytes 5" "Mast cells"
[10] "Megakaryocytes" "Monocytes 1" "Monocytes 2"
[13] "Monocytes 3" "Monocytes 4" "Plasma B cells"
[16] "Unknown"
Add as metadata and visualise on UMAP
sobj@meta.data$general_cell_labels <- clusters
DimPlot(sobj, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
scSeurat <- sobj
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/integrated_PBMC_cca_kanchor5_scClustViz.RData")
Stimulated data
Read in stimulated data
load("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
# Set identity
Idents(scSeurat) <- "integrated_snn_res.0.4"
View UMAP
DimPlot(scSeurat, label = TRUE)

Grab cluster IDs and replace with cell-type names - Endothelial
cells: 0, 3, 10 - Mesenchymal cells: 8, 9 - Hepatocytes: 4, 5, 12 - T
cells: 2, 6 - Lymphocytes: 1 - Plasma cells: 11 Clusters 0, 4, 8, 10
have odd gene expression
Visualise general cell-type markers
# Hepatocytes
FeaturePlot(scSeurat, features = c("ALB-1"))

FeaturePlot(scSeurat, features = c("CYP2E1","PCK1"))

# Endothelial
FeaturePlot(scSeurat, features = c("STAB2","CLEC4G"))

FeaturePlot(scSeurat, features = c("RSPO3","MECOM"))

# Lymphocytes
FeaturePlot(scSeurat, features = c("CD3E"))

FeaturePlot(scSeurat, features = c("XCL1;XCL2","LEF1"))

# B cells
FeaturePlot(scSeurat, features = c("CD79B", "MS4A1"))

# Plasma cells
FeaturePlot(scSeurat, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(scSeurat, features = c("LYZ-1","S100A8"))

FeaturePlot(scSeurat, features = c("CD5L","C1QB"))

FeaturePlot(scSeurat, features = c("CST3","FLT3"))

# Cholangiocytes
FeaturePlot(scSeurat, features = c("KRT19","SLC4A4"))

# Mesenchymal
FeaturePlot(scSeurat, features = c("HHIP"))

clusters <- as.character(Idents(scSeurat))
clusters <- gsub('\\b0\\b|\\b3\\b|\\b10\\b', "Endothelial",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b', "Myeloid",
clusters,
perl = TRUE)
clusters <- gsub('\\b2\\b|\\b6\\b', "Lymphocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b11\\b', "Antibody-secreting B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b4\\b|\\b5\\b|\\b12\\b', "Hepatocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b8\\b|\\b9\\b', "Mesenchymal",
clusters,
perl = TRUE)
clusters <- gsub('\\b7\\b|\\b13\\b', "Cholangiocytes",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells" "Cholangiocytes" "Endothelial"
[4] "Hepatocytes" "Lymphocytes" "Mesenchymal"
[7] "Myeloid"
Add as metadata and visualise on UMAP
scSeurat@meta.data$general_cell_labels <- clusters
DimPlot(scSeurat, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
Now add new labels but keep cluster numbers
clusters <- as.character(Idents(scSeurat))
clusters <- gsub('\\b0\\b', "Endothelial (0)", clusters, perl = TRUE)
clusters <- gsub('\\b3\\b', "Endothelial (3)", clusters, perl = TRUE)
clusters <- gsub('\\b11\\b', "Antibody-secreting B cells (11)",
clusters,
perl = TRUE)
clusters <- gsub('\\b12\\b', "Hepatocytes (12)", clusters, perl = TRUE)
clusters <- gsub('\\b13\\b', "Cholangiocytes (13)", clusters, perl = TRUE)
clusters <- gsub('\\b10\\b', "Endothelial (10)", clusters, perl = TRUE)
clusters <- gsub('\\b1\\b', "Myeloid (1)", clusters, perl = TRUE)
clusters <- gsub('\\b2\\b', "Lymphocytes (2)", clusters, perl = TRUE)
clusters <- gsub('\\b6\\b', "Lymphocytes (6)", clusters, perl = TRUE)
clusters <- gsub('\\b4\\b', "Hepatocytes (4)", clusters, perl = TRUE)
clusters <- gsub('\\b5\\b', "Hepatocytes (5)", clusters, perl = TRUE)
clusters <- gsub('\\b8\\b', "Mesenchymal (8)", clusters, perl = TRUE)
clusters <- gsub('\\b9\\b', "Mesenchymal (9)", clusters, perl = TRUE)
clusters <- gsub('\\b7\\b', "Cholangiocytes (7)", clusters, perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells (11)" "Cholangiocytes (13)"
[3] "Cholangiocytes (7)" "Endothelial (0)"
[5] "Endothelial (10)" "Endothelial (3)"
[7] "Hepatocytes (12)" "Hepatocytes (4)"
[9] "Hepatocytes (5)" "Lymphocytes (2)"
[11] "Lymphocytes (6)" "Mesenchymal (8)"
[13] "Mesenchymal (9)" "Myeloid (1)"
Add as metadata and visualise on UMAP
scSeurat@meta.data$general_cell_labels_clusts <- clusters
DimPlot(scSeurat, group.by = "general_cell_labels_clusts", label = TRUE)

Save object with labels added
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQWRkaW5nIG9mZmljaWFsIGNlbGwtdHlwZSBsYWJlbHMgdG8gU2V1cmF0IG9iamVjdHMgYmFzZWQgb24gY2x1c3RlciBsYWJlbHMuCgpMb2FkIGxpYnJhcmllcwoKYGBge3J9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpgYGAKCiMjIExpdmVyIG1hcAoKUmVhZCBpbiBsaXZlciBtYXAKCmBgYHtyfQpzb2JqIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9ab2Uvc2NmX3ZlcnNpb24vYW5hbHlzaXMvaGVhbHRoeV9zYy9zZXVyYXRfb2JqZWN0cy9kcm9wbGV0UUNfZmlsdGVyZWQvYWxsSW50ZWdyYXRlZF9jY2Ffa2FuY2hvcjVfbm9CaW9wc3lIZXBzX2Ryb3BsZXRRQ0ZpbHRlcmVkLlJEUyIpCnJlcyA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuNCIKSWRlbnRzKHNvYmopIDwtIHJlcwpgYGAKClZpZXcgVU1BUAoKYGBge3J9CkRpbVBsb3Qoc29iaiwgbGFiZWwgPSBUUlVFKQpgYGAKCkdyYWIgY2x1c3RlciBJRHMgYW5kIHJlcGxhY2Ugd2l0aCBjZWxsLXR5cGUgbmFtZXMKLSBFbmRvdGhlbGlhbCBjZWxsczogMCwgNSwgOCwgMTEsIDMwLCAzMiwgMzMsIDQxLCA0MgotIEx5bXBob2N5dGVzOiAxLCAyLCA0LCA2LCA3LCAxMCwgMTIsIDE0LCAyNCwgMzUKLSBMeW1waG9jeXRlcyAxOiAxLCAyLCA0LCA3LCAxMCwgMTIsIDE2Ci0gTHltcGhvY3l0ZXMgMiAoWENMMTtYQ0wyKyk6IDYsIDI0LCAzOQotIEx5bXBob2N5dGVzIDMgKExFRjErKTogMTQKLSBMeW1waG9jeXRlcyA0IChUT1AyQSspOiAzNQotIE15ZWxvaWQgY2VsbHM6IDMsIDksIDE1LCAxNywgMTgsIDIyLCAzMSwgMzcsIDQwLCA0MwotIE15ZWxvaWQgMSAoQ0Q1TCspOiAzLCAyMiwgNDMKLSBNeWVsb2lkIDIgKFMxMDBBOCspOiA5LCAxOAotIE15ZWxvaWQgMzogMTUsIDE3Ci0gTXllbG9pZCA0IChDU1QzKyk6IDMxCi0gSGVwYXRvY3l0ZXM6IDEzLCAxNiwgMTksIDIwLCAyMSwgMjUsIDI4LCAzNgotIEFudGlib2R5LXNlY3JldGluZyBCIGNlbGxzOiAyMwotIE1lc2VuY2h5bWFsOiAyNgotIEIgY2VsbHM6IDI3LCA0NAotIENob2xhbmdpb2N5dGVzOiAzNCwgMzgKLSBEb3VibGV0cy9jb250YW1pbmF0aW9uOiAyMCwgMjksIDM3LCA0MCwgNDIKClZpc3VhbGlzZSBnZW5lcmFsIGNlbGwtdHlwZSBtYXJrZXJzCgpgYGB7cn0KIyBIZXBhdG9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkFMQi0xIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ1lQMkUxIiwiUENLMSIpKQojIEVuZG90aGVsaWFsCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiU1RBQjIiLCJDTEVDNEciKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJSU1BPMyIsIk1FQ09NIikpCiMgTHltcGhvY3l0ZXMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDNFIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiWENMMTtYQ0wyIiwiTEVGMSIpKQojIEIgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDc5QiIsICJNUzRBMSIpKQojIFBsYXNtYSBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkpDSEFJTiIpKQojIE15ZWxvaWQgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJMWVotMSIsIlMxMDBBOCIpKQpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkNENUwiLCJDMVFCIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ1NUMyIsIkZMVDMiKSkKIyBDaG9sYW5naW9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIktSVDE5IiwiU0xDNEE0IikpCiMgTWFzdCBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIlByc3MyOSIpKQpgYGAKCgpgYGB7cn0KY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKElkZW50cyhzb2JqKSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMFxcYnxcXGI1XFxifFxcYjhcXGJ8XFxiMTFcXGJ8XFxiMzBcXGJ8XFxiMzJcXGJ8XFxiMzNcXGJ8XFxiNDFcXGJ8XFxiNDJcXGInLCAiRW5kb3RoZWxpYWwiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxXFxifFxcYjJcXGJ8XFxiNFxcYnxcXGI3XFxifFxcYjEwXFxifFxcYjEyXFxifFxcYjE2XFxiJywgIkx5bXBob2N5dGVzIDEiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI2XFxifFxcYjI0XFxifFxcYjM5XFxiJywgIkx5bXBob2N5dGVzIDIiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzXFxifFxcYjIyXFxifFxcYjQzXFxiJywgIk15ZWxvaWQgMSIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjE0XFxiJywgIkx5bXBob2N5dGVzIDMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzNVxcYicsICJMeW1waG9jeXRlcyA0IiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiOVxcYnxcXGIxOFxcYicsICJNeWVsb2lkIDIiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxNVxcYnxcXGIxN1xcYicsICJNeWVsb2lkIDMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzMVxcYicsICJNeWVsb2lkIDQiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxM1xcYnxcXGIxNlxcYnxcXGIxOVxcYnxcXGIyMFxcYnxcXGIyMVxcYnxcXGIyNVxcYnxcXGIyOFxcYnxcXGIzNlxcYicsICJIZXBhdG9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjIzXFxiJywgIkFudGlib2R5LXNlY3JldGluZyBCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMjZcXGInLCAiTWVzZW5jaHltYWwiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyN1xcYnxcXGI0NFxcYicsICJCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMzRcXGJ8XFxiMzhcXGInLCAiQ2hvbGFuZ2lvY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyMFxcYnxcXGIyOVxcYnxcXGIzN1xcYnxcXGI0MFxcYnxcXGI0MlxcYicsICJEb3VibGV0cy9Db250YW1pbmF0aW9uIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKbGV2ZWxzKGFzLmZhY3RvcihjbHVzdGVycykpCmBgYAoKQWRkIGFzIG1ldGFkYXRhIGFuZCB2aXN1YWxpc2Ugb24gVU1BUAoKYGBge3J9CnNvYmpAbWV0YS5kYXRhJGdlbmVyYWxfY2VsbF9sYWJlbHMgPC0gY2x1c3RlcnMKRGltUGxvdChzb2JqLCBncm91cC5ieSA9ICJnZW5lcmFsX2NlbGxfbGFiZWxzIiwgbGFiZWwgPSBUUlVFKQpgYGAKClNhdmUgb2JqZWN0IHdpdGggbGFiZWxzIGFkZGVkCgpgYGB7cn0Kc2F2ZVJEUyhzb2JqLAogICAgICAgIGZpbGUgPSAifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL2Ryb3BsZXRRQ19maWx0ZXJlZC9hbGxJbnRlZ3JhdGVkX2NjYV9rYW5jaG9yNV9ub0Jpb3BzeUhlcHNfZHJvcGxldFFDRmlsdGVyZWQuUkRTIikKYGBgCgpSZW1vdmUgb2JqZWN0cyBmcm9tIGVudmlyb25tZW50CgpgYGB7cn0Kcm0obGlzdD1scygpKQpnYygpCmBgYAoKCiMjIFBCTUMgbWFwCgpSZWFkIGluIFBCTUMgbWFwCgpgYGB7cn0KbG9hZCgifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL25vX2Ryb3BsZXRRQy9pbnRlZ3JhdGVkX1BCTUNfY2NhX2thbmNob3I1X3NjQ2x1c3RWaXouUkRhdGEiKQpzb2JqIDwtIHNjU2V1cmF0CnJlcyA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuNiIKSWRlbnRzKHNvYmopIDwtIHJlcwpgYGAKClZpZXcgVU1BUAoKYGBge3J9CkRpbVBsb3Qoc29iaiwgbGFiZWwgPSBUUlVFKQpgYGAKCkdyYWIgY2x1c3RlciBJRHMgYW5kIHJlcGxhY2Ugd2l0aCBjZWxsLXR5cGUgbmFtZXMKLSBNb25vY3l0ZXM6IDAsIDYsIDgsIDksIDIxLCAyNAotIE1vbm9jeXRlcyAxIChDRDE2Kyk6IDAsIDIxLCAyNAotIE1vbm9jeXRlcyAyIChDRDE0Kyk6IDYsIDkKLSBNb25vY3l0ZXMgMyAoaW50ZXJtZWRpYXRlPyk6IDgKLSBNb25vY3l0ZXMgNCAoUExBQzgrL2RlbmRyaXRpYz8pOiAxNCAKLSBMeW1waG9jeXRlczogMSwgMiwgNCwgNSwgNywgMTAsIDEzLCAxNSwgMTcKLSBMeW1waG9jeXRlcyAxOiAyLCA1LCAxMywgMTcKLSBMeW1waG9jeXRlcyAyIChYQ0wxO1hDTDIrKTogNCwgNwotIEx5bXBob2N5dGVzIDMgKExFRjErKTogMSwgMTAKLSBMeW1waG9jeXRlcyA0IChkaXZpZGluZyk6IDIzCi0gTHltcGhvY3l0ZXMgNSAoUkhFWCspOiAxNQotIEItY2VsbHM6IDMsIDExCi0gSFNDOiAxNgotIFBsYXNtYSBCOiAxOAotIE1lZ2FrYXJ5b2N5dGVzOiAxOQotIE1hc3QgY2VsbDogMjIKLSBFcnl0aHJvY3l0ZXM6IDEyCi0gVW5rbm93bjogMjAKClZpc3VhbGlzZSBnZW5lcmFsIGNlbGwtdHlwZSBtYXJrZXJzOgoKYGBge3J9CiMgTHltcGhvY3l0ZXMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDNFIiwiU1RNTjEiKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJYQ0wxO1hDTDIiLCJMRUYxIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiTktHNyIsIkNENSIpKQpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkNEMjQ3IiwiUkhFWCIpKQojIEIgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJCQU5LMSIsICJNUzRBMSIpKQojIFBsYXNtYSBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkpDSEFJTiIpKQojIE15ZWxvaWQgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJTMTAwQTgiKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDE0IiwiRkNHUjNBO0ZDR1IzQiIpKQpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkZjZ3IzO0ZjZ3IyYiIsIkZMVDMiKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDU1QzIiwiRkxUMyIpKQojIE1lZ2FrYXJ5b2N5dGVzCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiR1A5IiwiVFJFTUwxIikpCiMgTWFzdCBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIlByc3MyOSIsIlByc3MzNCIpKQojIEVyeXRocm9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkhCQTI7SEJBMSIpKQpgYGAKCgpgYGB7cn0KY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKElkZW50cyhzb2JqKSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiM1xcYnxcXGIxMVxcYicsICJCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMVxcYnxcXGIxMFxcYicsICJMeW1waG9jeXRlcyAzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMlxcYnxcXGI1XFxifFxcYjEzXFxifFxcYjE3XFxiJywgIkx5bXBob2N5dGVzIDEiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI0XFxifFxcYjdcXGInLCAiTHltcGhvY3l0ZXMgMiIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjBcXGJ8XFxiMjFcXGJ8XFxiMjRcXGInLCAiTW9ub2N5dGVzIDEiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyM1xcYicsICJMeW1waG9jeXRlcyA0IiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTVcXGInLCAiTHltcGhvY3l0ZXMgNSIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjZcXGJ8XFxiOVxcYicsICJNb25vY3l0ZXMgMiIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjhcXGInLCAiTW9ub2N5dGVzIDMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxNFxcYicsICJNb25vY3l0ZXMgNCIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjE4XFxiJywgIlBsYXNtYSBCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTZcXGInLCAiSGVtYXRvcG9pZXRpYyBzdGVtIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTlcXGInLCAiTWVnYWthcnlvY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyMlxcYicsICJNYXN0IGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTJcXGInLCAiRXJ5dGhyb2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMjBcXGInLCAiVW5rbm93biIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmxldmVscyhhcy5mYWN0b3IoY2x1c3RlcnMpKQpgYGAKCkFkZCBhcyBtZXRhZGF0YSBhbmQgdmlzdWFsaXNlIG9uIFVNQVAKCmBgYHtyfQpzb2JqQG1ldGEuZGF0YSRnZW5lcmFsX2NlbGxfbGFiZWxzIDwtIGNsdXN0ZXJzCkRpbVBsb3Qoc29iaiwgZ3JvdXAuYnkgPSAiZ2VuZXJhbF9jZWxsX2xhYmVscyIsIGxhYmVsID0gVFJVRSkKYGBgCgpTYXZlIG9iamVjdCB3aXRoIGxhYmVscyBhZGRlZAoKYGBge3J9CnNjU2V1cmF0IDwtIHNvYmoKc2F2ZShzQ1ZkYXRhX2xpc3QsIHNjU2V1cmF0LAogICAgIGZpbGUgPSAifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL25vX2Ryb3BsZXRRQy9pbnRlZ3JhdGVkX1BCTUNfY2NhX2thbmNob3I1X3NjQ2x1c3RWaXouUkRhdGEiKQpgYGAKCiMjIFN0aW11bGF0ZWQgZGF0YQoKUmVhZCBpbiBzdGltdWxhdGVkIGRhdGEKCmBgYHtyfQpsb2FkKCJ+L0Ryb3Bib3gvWm9lL3NjZl92ZXJzaW9uL2FuYWx5c2lzL2hlYWx0aHlfc2Mvc2V1cmF0X29iamVjdHMvbm9fZHJvcGxldFFDLzMzOTEvaW50ZWdyYXRlZF8zMzkxX3N0aW11bGF0aW9uX3BtYWlvX3Vuc3RpbV9kb3duc2FtcGxlZF9jY2Ffa2FuY2hvcjVfc2NDbHVzdFZpei5SRGF0YSIpCiMgU2V0IGlkZW50aXR5CklkZW50cyhzY1NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4wLjQiCmBgYAoKVmlldyBVTUFQCgpgYGB7cn0KRGltUGxvdChzY1NldXJhdCwgbGFiZWwgPSBUUlVFKQpgYGAKCkdyYWIgY2x1c3RlciBJRHMgYW5kIHJlcGxhY2Ugd2l0aCBjZWxsLXR5cGUgbmFtZXMKLSBFbmRvdGhlbGlhbCBjZWxsczogMCwgMywgMTAKLSBNZXNlbmNoeW1hbCBjZWxsczogOCwgOQotIEhlcGF0b2N5dGVzOiA0LCA1LCAxMgotIFQgY2VsbHM6IDIsIDYKLSBMeW1waG9jeXRlczogMQotIFBsYXNtYSBjZWxsczogMTEKQ2x1c3RlcnMgMCwgNCwgOCwgMTAgaGF2ZSBvZGQgZ2VuZSBleHByZXNzaW9uCgpWaXN1YWxpc2UgZ2VuZXJhbCBjZWxsLXR5cGUgbWFya2VycwoKYGBge3J9CiMgSGVwYXRvY3l0ZXMKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiQUxCLTEiKSkKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiQ1lQMkUxIiwiUENLMSIpKQojIEVuZG90aGVsaWFsCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIlNUQUIyIiwiQ0xFQzRHIikpCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIlJTUE8zIiwiTUVDT00iKSkKIyBMeW1waG9jeXRlcwpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJDRDNFIikpCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIlhDTDE7WENMMiIsIkxFRjEiKSkKIyBCIGNlbGxzCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNENzlCIiwgIk1TNEExIikpCiMgUGxhc21hIGNlbGxzCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkpDSEFJTiIpKQojIE15ZWxvaWQgY2VsbHMKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiTFlaLTEiLCJTMTAwQTgiKSkKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiQ0Q1TCIsIkMxUUIiKSkKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiQ1NUMyIsIkZMVDMiKSkKIyBDaG9sYW5naW9jeXRlcwpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJLUlQxOSIsIlNMQzRBNCIpKQojIE1lc2VuY2h5bWFsCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkhISVAiKSkKYGBgCgpgYGB7cn0KY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKElkZW50cyhzY1NldXJhdCkpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjBcXGJ8XFxiM1xcYnxcXGIxMFxcYicsICJFbmRvdGhlbGlhbCIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjFcXGInLCAiTXllbG9pZCIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjJcXGJ8XFxiNlxcYicsICJMeW1waG9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjExXFxiJywgIkFudGlib2R5LXNlY3JldGluZyBCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNFxcYnxcXGI1XFxifFxcYjEyXFxiJywgIkhlcGF0b2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiOFxcYnxcXGI5XFxiJywgIk1lc2VuY2h5bWFsIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiN1xcYnxcXGIxM1xcYicsICJDaG9sYW5naW9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmxldmVscyhhcy5mYWN0b3IoY2x1c3RlcnMpKQpgYGAKCkFkZCBhcyBtZXRhZGF0YSBhbmQgdmlzdWFsaXNlIG9uIFVNQVAKCmBgYHtyfQpzY1NldXJhdEBtZXRhLmRhdGEkZ2VuZXJhbF9jZWxsX2xhYmVscyA8LSBjbHVzdGVycwpEaW1QbG90KHNjU2V1cmF0LCBncm91cC5ieSA9ICJnZW5lcmFsX2NlbGxfbGFiZWxzIiwgbGFiZWwgPSBUUlVFKQpgYGAKClNhdmUgb2JqZWN0IHdpdGggbGFiZWxzIGFkZGVkCgpgYGB7cn0Kc2F2ZShzQ1ZkYXRhX2xpc3QsIHNjU2V1cmF0LAogICAgIGZpbGUgPSAifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL25vX2Ryb3BsZXRRQy8zMzkxL2ludGVncmF0ZWRfMzM5MV9zdGltdWxhdGlvbl9wbWFpb191bnN0aW1fZG93bnNhbXBsZWRfY2NhX2thbmNob3I1X3NjQ2x1c3RWaXouUkRhdGEiKQpgYGAKCk5vdyBhZGQgbmV3IGxhYmVscyBidXQga2VlcCBjbHVzdGVyIG51bWJlcnMKCmBgYHtyfQpjbHVzdGVycyA8LSBhcy5jaGFyYWN0ZXIoSWRlbnRzKHNjU2V1cmF0KSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMFxcYicsICJFbmRvdGhlbGlhbCAoMCkiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjNcXGInLCAiRW5kb3RoZWxpYWwgKDMpIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxMVxcYicsICJBbnRpYm9keS1zZWNyZXRpbmcgQiBjZWxscyAoMTEpIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTJcXGInLCAiSGVwYXRvY3l0ZXMgKDEyKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTNcXGInLCAiQ2hvbGFuZ2lvY3l0ZXMgKDEzKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTBcXGInLCAiRW5kb3RoZWxpYWwgKDEwKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMVxcYicsICJNeWVsb2lkICgxKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMlxcYicsICJMeW1waG9jeXRlcyAoMikiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjZcXGInLCAiTHltcGhvY3l0ZXMgKDYpIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI0XFxiJywgIkhlcGF0b2N5dGVzICg0KSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNVxcYicsICJIZXBhdG9jeXRlcyAoNSkiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjhcXGInLCAiTWVzZW5jaHltYWwgKDgpIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI5XFxiJywgIk1lc2VuY2h5bWFsICg5KSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiN1xcYicsICJDaG9sYW5naW9jeXRlcyAoNykiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmxldmVscyhhcy5mYWN0b3IoY2x1c3RlcnMpKQpgYGAKCkFkZCBhcyBtZXRhZGF0YSBhbmQgdmlzdWFsaXNlIG9uIFVNQVAKCmBgYHtyfQpzY1NldXJhdEBtZXRhLmRhdGEkZ2VuZXJhbF9jZWxsX2xhYmVsc19jbHVzdHMgPC0gY2x1c3RlcnMKRGltUGxvdChzY1NldXJhdCwgZ3JvdXAuYnkgPSAiZ2VuZXJhbF9jZWxsX2xhYmVsc19jbHVzdHMiLCBsYWJlbCA9IFRSVUUpCmBgYAoKU2F2ZSBvYmplY3Qgd2l0aCBsYWJlbHMgYWRkZWQKCmBgYHtyfQpzYXZlKHNDVmRhdGFfbGlzdCwgc2NTZXVyYXQsCiAgICAgZmlsZSA9ICJ+L0Ryb3Bib3gvWm9lL3NjZl92ZXJzaW9uL2FuYWx5c2lzL2hlYWx0aHlfc2Mvc2V1cmF0X29iamVjdHMvbm9fZHJvcGxldFFDLzMzOTEvaW50ZWdyYXRlZF8zMzkxX3N0aW11bGF0aW9uX3BtYWlvX3Vuc3RpbV9kb3duc2FtcGxlZF9jY2Ffa2FuY2hvcjVfc2NDbHVzdFZpei5SRGF0YSIpCmBgYAoKCgo=